import {toRaw} from 'vue';
import type {App} from 'vue';
import localForage from 'localforage'
import {createPinia, Pinia, type Store} from 'pinia';

/**
 * 全局注册 store
 * 用户定义的 store 拥有 loadFromIndexDb 方法的时候会自动吧数据存储到 indexDb
 * 名称为 'state-' + store.$id
 */
export function storePluginInstall(pinia: Pinia, app: App<Element>) {
    async function indexDbPlugin({store}: { store: Store }) {
        if (typeof store['loadFromIndexDb'] !== 'function') {
            // loadFromIndexDb 方法存在的时候，才启用本地存储
            return
        }

        const stored = await localForage.getItem('state-' + store.$id)

        if (stored) {
            // loadFromIndexDb 方法存在的时候，本地存储的数据覆盖默认数据
            store['loadFromIndexDb'](stored)
        }

        store.$subscribe(() => {
            const state = toRaw(store.$state)
            localForage.setItem('state-' + store.$id, state)
        })
    }

    pinia.use(indexDbPlugin)
}